﻿/*
SINACOR - BMF&Bovespa
Arquivo: ControleMovimentoBolsa.cs
Criado em: 17-mar-2010 16:37:58
Arquiteto Responsável: p-Wgeneroso
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Core.ProcessManager.Server;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using PSE.ProcessManager.Common.Process;
using Sinacor.Infra.Core.ProcessManager.Server.Security;
using PSE.ProcessManager.Server.Process.Security;


namespace Sinacor.Process.Bovespa.ControleMovimentoBolsa.Server.ProcessLogic
{
    public class ControleMovimentoBolsa : BaseProcessLogic
    {
       

        #region Campos
        private int _erroObjetoNulo = 109679;
        private int _erroSemPermissaoAcesso = 109673;
        #endregion

        #region Propriedades

        public int ErroObjetoNulo
        {
            get { return _erroObjetoNulo; }
            set { _erroObjetoNulo = value; }
        }


        public int ErroSemPermissaoAcesso
        {
            get { return _erroSemPermissaoAcesso; }
            set { _erroSemPermissaoAcesso = value; }
        }
        #endregion

        #region Métodos
        /// <summary>
        /// Abre o movimento da bolsa
        /// </summary>
        public ProcessEntity.ControleMovimento AbrirMovimento()
        {
            if (this.VerificarPermissaoAcesso())
            {
                AberturaMovimentoBolsa aberturaMovimento = new AberturaMovimentoBolsa();
                return aberturaMovimento.AbrirMovimento();
            }
            else
            {
                throw new BusinessException(ErroSemPermissaoAcesso);
            }
            //Verificar se usuário possui acesso
            //consumindo o método
            //
            //Se VerificarPermissaoAcesso() igual a
            //verdadeiro
            //
            // Consumir o método
            //AberturaMovimentoBolsa.AbrirMovimento()
            //
            //SeNao
            //
            //
            //BusinessException(ErroSemPermissaoAcesso
            //)
            //
            //FimSe
            //    
        }

        /// <summary>
        /// Consolida o fechamento do movimento.
        /// </summary>
        /// <param name="entity"></param>
        public void ConsolidarFechamento(ProcessEntity.Parameter.FiltroControleMovimento entity)
        {
            ProcessLogic.ConsolidacaoMovimentoBolsa consolidacaoMovimentoBolsa = new ConsolidacaoMovimentoBolsa();
            if (entity != null)
            {
                if (this.VerificarPermissaoAcesso())
                {
                    consolidacaoMovimentoBolsa.ConsolidarMovimento(entity);
                }
                else
                {
                    throw new BusinessException(ErroSemPermissaoAcesso);
                }
            }
        }

        /// <summary>
        /// Fecha o movimento da Bolsa
        /// </summary>
        /// <param name="entity"></param>
        public ProcessEntity.MensagemFechamento FecharMovimento(ProcessEntity.Parameter.FiltroFechamentoMovimento entity)
        {
            ProcessLogic.FechamentoMovimentoBolsa fechamentoMovimentoBolsa = new FechamentoMovimentoBolsa();
            ProcessEntity.MensagemFechamento message = new Sinacor.Process.Bovespa.ControleMovimentoBolsa.ProcessEntity.MensagemFechamento(); 
            if (entity != null)
            {
                if (this.VerificarPermissaoAcesso())
                {                   
                   message = fechamentoMovimentoBolsa.FecharMovimento(entity);                    
                }
                else
                {
                    throw new BusinessException(ErroSemPermissaoAcesso);
                }
            }
            return message;

            //Verificar diagrama de atividades
            //ControleMovimentoBolsa.FecharMovimento()        
        }

        /// <summary>
        /// Reabre o movimento da bolsa
        /// </summary>
        /// <param name="entity"></param>
        public void ReabrirMovimento(ProcessEntity.Parameter.FiltroControleMovimento entity)
        {
            ProcessLogic.ConsolidacaoMovimentoBolsa consolidacaoMovimentoBolsa = new ConsolidacaoMovimentoBolsa();
            ProcessLogic.FechamentoMovimentoBolsa fechamentoMovimentoBolsa = new FechamentoMovimentoBolsa();
            ProcessLogic.ReaberturaMovimentoBolsa reaberturaMovimentoBolsa = new ReaberturaMovimentoBolsa();
            if (entity != null)
            {
                if (this.VerificarPermissaoAcesso())
                {                    
                    reaberturaMovimentoBolsa.ReabrirMovimento(entity);
                }
                else
                {
                    throw new BusinessException(ErroSemPermissaoAcesso);
                }
            }
        }

        /// <summary>
        /// Simula o fechamento do movimento.
        /// </summary>
        /// <param name="entity"></param>
        public ProcessEntity.MensagemSimulacao SimularFechamento(ProcessEntity.Parameter.FiltroFechamentoMovimento entity)
        {
            ProcessLogic.FechamentoMovimentoBolsa fechamentoMovimentoBolsa = new FechamentoMovimentoBolsa();
            ProcessEntity.MensagemSimulacao retorno = null;
            if(entity!=null)
            {
                if (this.VerificarPermissaoAcesso())
                    retorno = fechamentoMovimentoBolsa.SimularFechamento(entity);
                else
                    throw new BusinessException(ErroSemPermissaoAcesso);
            }
            return retorno;
        }

        /// <summary>
        /// Verifica se o usuário logado possui acesso para ações de controle de movimento
        /// da bolsa
        /// </summary>
        private bool VerificarPermissaoAcesso()
        {
            //Checar se o usuário possui acesso para
            //função "BPROCE"
            if (!AuthorizationContext<SinacorAuthorizationContext>.Current.CheckUserAccess("BPROCE", "BOL"))
            {
                throw new BusinessException(ErroSemPermissaoAcesso);               
            }
            return true;
        }
        #endregion
    }

}